/*
 * Copyright (c) 2012 SUBSECRETARIA DEFENSORIA DEL ESPACIO PUBLICO - SDEP.
 * All Rights Reserved.
 * This software is the confidential and proprietary information of SDEP
 * Developed By CONSTULT-SOFT S.A, Development Team 2012.
 */
package co.gov.medellin.sdep.sisdep.model.dao.impl;

import java.math.BigDecimal;
import java.sql.Timestamp;
import java.text.ParseException;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.Map;

import org.springframework.transaction.PlatformTransactionManager;

import co.gov.medellin.sdep.sisdep.common.OracleHelper;
import co.gov.medellin.sdep.sisdep.common.dto.GenericComponentVO;
import co.gov.medellin.sdep.sisdep.common.dto.GenericComponentValueVO;
import co.gov.medellin.sdep.sisdep.model.Operativo;
import co.gov.medellin.sdep.sisdep.model.dao.OperativoDAOImpl;

/**
 * <p>
 * Implementacion de los metodos especializados de acceso a datos, necesarios para la gestion de Operativos ejecutados por ESPUB.
 * </p>
 * <p>
 * Copyright (c) 2012<BR>
 * Consult-Soft S.A.<BR>
 * Created on: Jul 03, 2012<BR>
 * 
 * @author atabares
 * </p>
 */
public class OperativoDAOTImpl extends OperativoDAOImpl implements IOperativoDAOT {

	/** Manejador de transacciones para OperativoDAOTImpl */
	private PlatformTransactionManager transactionManager;
	
	/**
	 * Constructor por defecto
	 */
	public OperativoDAOTImpl() {
	}
	
	/**
	 * Retorna el transactionManager
	 * @return
	 */
	public PlatformTransactionManager getTransactionManager() {
		return transactionManager;
	}

	/**
	 * Establece el transaction manager establecido en la configuracion
	 * @param transactionManager
	 */
	public void setTransactionManager(PlatformTransactionManager transactionManager) {
		this.transactionManager = transactionManager;
	}
	
	/* (non-Javadoc)
	 * @see co.gov.medellin.sdep.sisdep.model.dao.impl.IOperativoDAOT#getOperativoListByCriteria(co.gov.medellin.sdep.sisdep.model.Operativo)
	 */
	public List getOperativoListByCriteria(Operativo operativoSearch) {

		StringBuffer query = new StringBuffer();
		
		query.append("SELECT OPER.ID, OPER.FECHA_OPERATIVO, OPER.TURNO, OPER.DIRECCION_OPERATIVO, ");
		query.append("OPER.DESCRIPCION, OPER.ESTADO AS OPE_ESTADO, OPER.METROS_RECUPERADOS, VLRT1.VRT_NOMBRE AS CUADRANTE, ");
		query.append("VLRT2.VRT_NOMBRE AS TIPO, (RECU.PRIMER_NOMBRE || ' ' || RECU.SEGUNDO_NOMBRE || ' ' || ");
		query.append("RECU.PRIMER_APELLIDO || ' ' || RECU.SEGUNDO_APELLIDO) AS NOM_COORDINADOR ");
		query.append("FROM OPE_OPERATIVO_T OPER ");
		query.append("INNER JOIN GES_RECURSO_HUMANO_T RECU ON RECU.ID = OPER.COORDINADOR ");
		query.append("INNER JOIN ADM_VALOR_TIPO_MAESTRA_T VLRT1 ON VLRT1.ID_VALOR_TIPO = OPER.CUADRANTE ");
		query.append("INNER JOIN ADM_VALOR_TIPO_MAESTRA_T VLRT2 ON VLRT2.ID_VALOR_TIPO = OPER.ID_TIPO_OPERATIVO ");
		
		if (operativoSearch.getCuadrante() != null) {
            query.append("AND OPER.CUADRANTE = ? ");
        }
		
		if (operativoSearch.getCoordinador() != null) {
            query.append("AND OPER.COORDINADOR = ? ");
        }
		
		if (operativoSearch.getIdTipoOperativo() != null) {
            query.append("AND OPER.ID_TIPO_OPERATIVO = ? ");
        }
		
		if (!OracleHelper.isNullorEmpty(operativoSearch.getEstado())) {
            query.append("AND OPER.ESTADO = ? ");
        }
		
		if (!OracleHelper.isNullorEmpty(operativoSearch.getInitDate())
			&& !OracleHelper.isNullorEmpty(operativoSearch.getEndDate())) {
		    
			query.append("AND OPER.FECHA_OPERATIVO BETWEEN ? AND ? + INTERVAL '1' DAY ");
		}
		
		query.append(" ORDER BY OPER.FECHA_OPERATIVO, OPER.CUADRANTE");
		
		List params = new ArrayList();
		
		if (operativoSearch.getCuadrante() != null) {
			params.add(operativoSearch.getCuadrante());
        }
		
		if (operativoSearch.getCoordinador() != null) {
			params.add(operativoSearch.getCoordinador());
        }
		
		if (operativoSearch.getIdTipoOperativo() != null) {
			params.add(operativoSearch.getIdTipoOperativo());
        }
		
		if (!OracleHelper.isNullorEmpty(operativoSearch.getEstado())) {
			params.add(operativoSearch.getEstado());
        }
		
		if (!OracleHelper.isNullorEmpty(operativoSearch.getInitDate())
				&& !OracleHelper.isNullorEmpty(operativoSearch.getEndDate())) {
		    
			try {
				params.add(OracleHelper.string2date(operativoSearch.getInitDate()));
				params.add(OracleHelper.string2date(operativoSearch.getEndDate()));
			} catch (ParseException e) {
				e.printStackTrace(System.err);
			}
		}
		
		System.out.println("XXX: " + query.toString());
		
		List rows = this.getJdbcTemplate().queryForList(query.toString(), params.toArray());
		
    	List operativoList = new ArrayList();
    	Iterator iterator = rows.iterator();
    	
    	while (iterator.hasNext()) {
    		Map operativoMap = (Map) iterator.next();
    		
    		Operativo operativoTemp = new Operativo();
    		
    		operativoTemp.setId(new Long(((BigDecimal) operativoMap.get("ID")).longValue()));
			operativoTemp.setCuadranteStr((String) operativoMap.get("CUADRANTE"));
			operativoTemp.setCoordinadorStr((String) operativoMap.get("NOM_COORDINADOR"));
			operativoTemp.setTipoOperativoStr((String) operativoMap.get("TIPO"));
			operativoTemp.setFechaOperativoStr(OracleHelper
					.timeStamp2string((Timestamp) operativoMap.get("FECHA_OPERATIVO")));
			operativoTemp.setTurno((String) operativoMap.get("TURNO"));
			operativoTemp.setDireccionOperativo((String) operativoMap.get("DIRECCION_OPERATIVO"));
			operativoTemp.setDescripcion((String) operativoMap.get("DESCRIPCION"));
			operativoTemp.setEstado((String) operativoMap.get("OPE_ESTADO"));
			operativoTemp.setMetrosRecuperados((String) operativoMap.get("METROS_RECUPERADOS"));
			
			operativoList.add(operativoTemp);
    	}
		
		return operativoList;
	}

	/* (non-Javadoc)
	 * @see co.gov.medellin.sdep.sisdep.model.dao.impl.IOperativoDAOT#getRecursoHumanoList()
	 */
	public GenericComponentVO getRecursoHumanoList() {
		StringBuffer query = new StringBuffer();
		
		query.append("SELECT DISTINCT ID, (PRIMER_NOMBRE || ' ' || SEGUNDO_NOMBRE ");
		query.append("|| ' ' || PRIMER_APELLIDO || ' ' || SEGUNDO_APELLIDO) AS NOMBRE ");
		query.append("FROM GES_RECURSO_HUMANO_T ");
		query.append("ORDER BY NOMBRE");
		
		List rows = this.getJdbcTemplate().queryForList(query.toString());
		
    	Iterator iterator = rows.iterator();
    	GenericComponentVO genericComponentVO = new GenericComponentVO();
    	
    	while (iterator.hasNext()) {
    		Map moduloMap = (Map) iterator.next();
    		GenericComponentValueVO genericComponentValueVO = new GenericComponentValueVO();
    		
    		genericComponentValueVO.setComponentValueId(((BigDecimal) moduloMap.get("ID")).toString());
    		genericComponentValueVO.setComponentValueName((String) moduloMap.get("NOMBRE"));
			
    		genericComponentVO.getComponentValueList().add(genericComponentValueVO);
    	}
		
		return genericComponentVO;
	}

}
